home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
formats
/
iff
/
newiff.lzh
/
NewIFF
/
NewIFF.lzh
/
newiff
/
iffp
/
smus.h
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-18
|
8KB
|
184 lines
/*----------------------------------------------------------------------*
* SMUS.H Definitions for Simple MUSical score. 2/12/86
*
* By Jerry Morrison and Steve Hayes, Electronic Arts.
* This software is in the public domain.
*
* Modified for use with iffparse.library 05/91 - CAS_CBM
*
* This version for the Commodore-Amiga computer.
*----------------------------------------------------------------------*/
#ifndef SMUS_H
#define SMUS_H
#ifndef COMPILER_H
#include "iffp/compiler.h"
#endif
#include "iffp/iff.h"
#define ID_SMUS MAKE_ID('S', 'M', 'U', 'S')
#define ID_SHDR MAKE_ID('S', 'H', 'D', 'R')
/* Now defined in iffp/iff.h as generic chunks
#define ID_NAME MAKE_ID('N', 'A', 'M', 'E')
#define ID_Copyright MAKE_ID('(', 'c', ')', ' ')
#define ID_AUTH MAKE_ID('A', 'U', 'T', 'H')
#define ID_ANNO MAKE_ID('A', 'N', 'N', 'O')
*/
#define ID_INS1 MAKE_ID('I', 'N', 'S', '1')
#define ID_TRAK MAKE_ID('T', 'R', 'A', 'K')
/* ---------- SScoreHeader ---------------------------------------------*/
typedef struct {
UWORD tempo; /* tempo, 128ths quarter note/minute */
UBYTE volume; /* playback volume 0 through 127 */
UBYTE ctTrack; /* count of tracks in the score */
} SScoreHeader;
/* ---------- NAME -----------------------------------------------------*/
/* NAME chunk contains a CHAR[], the musical score's name. */
/* ---------- Copyright (c) --------------------------------------------*/
/* "(c) " chunk contains a CHAR[], the FORM's copyright notice. */
/* ---------- AUTH -----------------------------------------------------*/
/* AUTH chunk contains a CHAR[], the name of the score's author. */
/* ---------- ANNO -----------------------------------------------------*/
/* ANNO chunk contains a CHAR[], the author's text annotations. */
/* ---------- INS1 -----------------------------------------------------*/
/* Constants for the RefInstrument's "type" field. */
#define INS1_Name 0 /* just use the name; ignore data1, data2 */
#define INS1_MIDI 1 /* <data1, data2> = MIDI <channel, preset> */
typedef struct {
UBYTE iRegister; /* set this instrument register number */
UBYTE type; /* instrument reference type (see above) */
UBYTE data1, data2; /* depends on the "type" field */
char name[60]; /* instrument name */
} RefInstrument;
/* ---------- TRAK -----------------------------------------------------*/
/* TRAK chunk contains an SEvent[]. */
/* SEvent: Simple musical event. */
typedef struct {
UBYTE sID; /* SEvent type code */
UBYTE data; /* sID-dependent data */
} SEvent;
/* SEvent type codes "sID". */
#define SID_FirstNote 0
#define SID_LastNote 127 /* sIDs in the range SID_FirstNote through
* SID_LastNote (sign bit = 0) are notes. The
* sID is the MIDI tone number (pitch). */
#define SID_Rest 128 /* a rest; same data format as a note. */
#define SID_Instrument 129 /* set instrument number for this track. */
#define SID_TimeSig 130 /* set time signature for this track. */
#define SID_KeySig 131 /* set key signature for this track. */
#define SID_Dynamic 132 /* set volume for this track. */
#define SID_MIDI_Chnl 133 /* set MIDI channel number (sequencers) */
#define SID_MIDI_Preset 134 /* set MIDI preset number (sequencers) */
#define SID_Clef 135 /* inline clef change.
* 0=Treble, 1=Bass, 2=Alto, 3=Tenor. */
#define SID_Tempo 136 /* Inline tempo change in beats per minute.*/
/* SID values 144 through 159: reserved for Instant Music SEvents. */
/* The remaining sID values up through 254: reserved for future
* standardization. */
#define SID_Mark 255 /* SID reserved for an end-mark in RAM. */
/* ---------- SEvent FirstNote..LastNote or Rest -----------------------*/
typedef struct {
unsigned tone :8, /* MIDI tone number 0 to 127; 128 = rest */
chord :1, /* 1 = a chorded note */
tieOut :1, /* 1 = tied to the next note or chord */
nTuplet :2, /* 0 = none, 1 = triplet, 2 = quintuplet,
* 3 = septuplet */
dot :1, /* dotted note; multiply duration by 3/2 */
division :3; /* basic note duration is 2**-division:
* 0 = whole note, 1 = half note, 2 = quarter
* note, ... 7 = 128th note */
} SNote;
/* Warning: An SNote is supposed to be a 16-bit entity.
* Some C compilers will not pack bit fields into anything smaller
* than an int. So avoid the actual use of this type unless you are certain
* that the compiler packs it into a 16-bit word.
*/
/* You may get better object code by masking, ORing, and shifting using the
* following definitions rather than the bit-packed fields, above. */
#define noteChord (1<<7) /* note is chorded to next note */
#define noteTieOut (1<<6) /* note/chord is tied to next note/chord */
#define noteNShift 4 /* shift count for nTuplet field */
#define noteN3 (1<<noteNShift) /* note is a triplet */
#define noteN5 (2<<noteNShift) /* note is a quintuplet */
#define noteN7 (3<<noteNShift) /* note is a septuplet */
#define noteNMask noteN7 /* bit mask for the nTuplet field */
#define noteDot (1<<3) /* note is dotted */
#define noteDShift 0 /* shift count for division field */
#define noteD1 (0<<noteDShift) /* whole note division */
#define noteD2 (1<<noteDShift) /* half note division */
#define noteD4 (2<<noteDShift) /* quarter note division */
#define noteD8 (3<<noteDShift) /* eighth note division */
#define noteD16 (4<<noteDShift) /* sixteenth note division */
#define noteD32 (5<<noteDShift) /* thirty-secondth note division */
#define noteD64 (6<<noteDShift) /* sixty-fourth note division */
#define noteD128 (7<<noteDShift) /* 1/128 note division */
#define noteDMask noteD128 /* bit mask for the division field */
#define noteDurMask 0x3F /* bit mask for all duration fields
* division, nTuplet, dot */
/* Field access: */
#define IsChord(snote) (((UWORD)snote) & noteChord)
#define IsTied(snote) (((UWORD)snote) & noteTieOut)
#define NTuplet(snote) ((((UWORD)snote) & noteNMask) >> noteNShift)
#define IsDot(snote) (((UWORD)snote) & noteDot)
#define Division(snote) ((((UWORD)snote) & noteDMask) >> noteDShift)
/* ---------- TimeSig SEvent -------------------------------------------*/
typedef struct {
unsigned type :8, /* = SID_TimeSig */
timeNSig :5, /* time signature "numerator" timeNSig + 1 */
timeDSig :3; /* time signature "denominator" is
* 2**timeDSig: 0 = whole note, 1 = half
* note, 2 = quarter note, ...
* 7 = 128th note */
} STimeSig;
#define timeNMask 0xF8 /* bit mask for timeNSig field */
#define timeNShift 3 /* shift count for timeNSig field */
#define timeDMask 0x07 /* bit mask for timeDSig field */
/* Field access: */
#define TimeNSig(sTime) ((((UWORD)sTime) & timeNMask) >> timeNShift)
#define TimeDSig(sTime) (((UWORD)sTime) & timeDMask)
/* ---------- KeySig SEvent --------------------------------------------*/
/* "data" value 0 = Cmaj; 1 through 7 = G,D,A,E,B,F#,C#;
* 8 through 14 = F,Bb,Eb,Ab,Db,Gb,Cb. */
/* ---------- Dynamic SEvent -------------------------------------------*/
/* "data" value is a MIDI key velocity 0..127. */
/* ---------- SMUS Writer Support Routines -----------------------------*/
/* Just call this to write a SHDR chunk. */
#define PutSHDR(iff, ssHdr) \
PutCk(iff, ID_SHDR, sizeof(SScoreHeader), (BYTE *)ssHdr)
#endif